Linie ⊂ Bézier ⊂ B-Spline ⊂ NURBS
Jede analytische Kurve ist ein NURBS-Spezialfall → einheitlicher Standard (CATIA, SolidWorks, NX, OCCT).
geomType |
Bedeutung |
|---|---|
LINE, CIRCLE, ELLIPSE |
analytisch, exakt gespeichert |
BSPLINE |
Freiformkurve (B-Spline / NURBS – dieselbe Klasse) |
Beim STEP-Import erscheinen Freiformkurven als BSPLINE, teils sogar ursprüngliche Kreise – je nach exportierendem System.
Beim Aneinanderstoßen von Kurven/Flächen zählt die Anschlussbedingung:
| Klasse | stimmt überein | sichtbar |
|---|---|---|
| Position | Knick erlaubt | |
| Tangentenrichtung | glatt fürs Auge | |
| Krümmung | reflexionsglatt |
Rechts: Linie trifft Kreisbogen tangential – , kein Knick. Der Krümmungskamm springt aber am Übergang von 0 auf : nur , nicht .
Nicht überall ist nötig – aber wo, dann hart:
| Anwendung | warum |
|---|---|
| Optik / Design | Lichtreflexion folgt der Krümmung – ein Sprung ist sichtbar |
| Fertigung | Fräserbahn = Versatz der Fläche – Krümmungssprung → Maßfehler |
| Aerodynamik | Grenzschicht reagiert auf Krümmungsänderung |
| Kontakt / Implantate | Spannungsspitze genau am Krümmungssprung |
Faustregel: für boolesche Kanten, für fillet, für Karosserie/Strömung.
Eine Fläche hat zwei Parameter:
Alles von den Kurven gilt eine Dimension höher weiter. Die analytische Familie (Ebene, Zylinder, Kegel, Kugel, Torus) reicht für Standardkörper – der Rest wird BSPLINE.
Die Normale ist (normiert) – genau das, was normalAt() aus Einheit 2 berechnet.
ruled vs. glattDas Eingangsprofil bestimmt die Ausgabefläche. Loft hat zusätzlich eine Stetigkeits-Entscheidung:
secs = [cf.wire(cf.circle(10)),
cf.wire(cf.circle(16)).translate((0,0,25)),
cf.wire(cf.circle(10)).translate((0,0,50))]
cf.loft(secs, ruled=True) # ['CONE', 'CONE'] – Knick in der Mitte
cf.loft(secs, ruled=False) # ['BSPLINE'] – eine glatte Fläche
ruled=True: gerade Verbindung, (Bézier-Analogon). Default glatt: eine B-Spline-Fläche über alle Schnitte.
fillet ist ein Flächenerzeugerbox = cf.box(50, 30, 20)
box_f = cf.fillet(box, box.edges(), 3.0)
print(sorted(set(f.geomType() for f in box_f.Faces())))
# ['CYLINDER', 'PLANE', 'SPHERE']
Das ist dieselbe Verrundung wie seit Einheit 1 – jetzt sehen Sie, welche Flächen sie erzeugt.
Der Kanal verjüngt sich zum Auslass (gleichmäßige Flussverteilung). Bauen Sie einen zweiten, kleineren Querschnitt – gleiches Prinzip, kleinere Maße:
auslass = [(22,0,0),(13,4,0),(0,5,0),(-10,3,0),
(-15,0,0),(-10,-3,0),(0,-5,0),(13,-4,0)]
profil_auslass = cf.spline(*auslass, periodic=True)
.translate((0,0,z))).profil.geomType() für Ihre Splines – und für einen Kreis (cf.circle). Was fällt auf?cf.offset2D(cf.wire(profil), 3.0)) und lesen Sie die geomType-Werte der Ergebniskanten. Analytisch oder nicht?curvatureAt(t) entlang eines Profils ab – wo ist die Krümmung am größten (Nase vs. flanke)?cf.loft) – und ruled=True vs. False vergleichenw05/ (beide Profile) committet und gepusht